package com.gjh.ouygoing.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gjh.ouygoing.controller.BaseController;
import com.gjh.ouygoing.entity.OrderInfo;
import com.gjh.ouygoing.entity.RefundInfo;
import com.gjh.ouygoing.mapper.RefundInfoMapper;
import com.gjh.ouygoing.service.OrderInfoService;
import com.gjh.ouygoing.service.RefundInfoService;
import com.gjh.ouygoing.util.GsonUtil;
import com.gjh.ouygoing.util.OrderNoUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class RefundInfoServiceImpl extends ServiceImpl<RefundInfoMapper, RefundInfo> implements RefundInfoService {
    /**
     * 引入订单信息的方法
     */
    @Autowired
    private OrderInfoService orderInfoService;

    /**
     * 用来创建我的这个申请订单信息
     * @param orderNo 订单编号
     * @param reason 退款原因
     * @return 退款信息
     */
    @Override
    public RefundInfo createOrefundByOrderNo(String orderNo,String reason) {
        log.info("创建退款信息开始");
        //在这里我们可以通过更改我们的数据库当中的信息
        //第一步需要进行更具我的这个订单去查询相关的订单信息
        OrderInfo orderInfo = orderInfoService.inquiryOrderInfo(orderNo);
        RefundInfo refundInfo = new RefundInfo();
        //获取订单编号
        //获得我的这个退款编号
        //获取我的这个原价格
        //获取原订单信息
        //存入我的这个支付状态
        //用来把我的这个订单信息存入到我的这个数据库当中
        refundInfo.setOrderNo(orderNo).
                setRefundNo(OrderNoUtils.getRefundNo())
                .setTotalFee(orderInfo.getTotalFee())
                .setRefund(orderInfo.getTotalFee())
                .setReason(reason);

        baseMapper.insert(refundInfo);
        log.info("创建退款信息成功");
        return refundInfo;
    }

    /**
     * 这个可以使用退款通知和我的这个退款申请同时都可以使用我们的这个方法
     * 更新我们的这个退款状态
     * @param bodyAsString
     */
    @Override
    public void updateRefund(String bodyAsString) {
        //先把微信端响应的结果转换成一个HashMap集合
        Map<String,String> resultHashMap = GsonUtil.fromJson(bodyAsString);


        QueryWrapper<RefundInfo>  RefundWrapper = new QueryWrapper<RefundInfo>()
                .eq("refund_no", resultHashMap.get("out_refund_no"));//根据退款订单得到我的这个queryWrapper对象
        //准备一些需要修改的数据,实例化一个退款的实体类
        RefundInfo refundInfo = new RefundInfo();
        refundInfo.setRefundNo( resultHashMap.get("refund_id"));//微信支付退款单号
         //因为当前的这个方法在回调的时候也会执行这个方法，所以我们先进行相关的判断，一个是申请中的回调和回调中的参数是不一样的

        //查询我的这个退款通知是否为空,因为他们是同一个字段来进行赋值操作
        if (!StringUtils.isEmpty(resultHashMap.get("status"))) {//微信支付的订单状态
            refundInfo.setRefundStatus(resultHashMap.get("status"));
            refundInfo.setContentReturn(bodyAsString);//然后把整个申请退款返回通知的数据参数存入到我的这个数据库当中
        }
        //退款通知是否为空
        if (!StringUtils.isEmpty(resultHashMap.get("refund_status"))) {
            refundInfo.setRefundStatus(resultHashMap.get("refund_status"));
            refundInfo.setContentNotify(bodyAsString);//然后把整个退款结果通知的数据参数存入到我的这个数据库当中
        }
        baseMapper.update(refundInfo,RefundWrapper);//执行修改的操作
    }
}
